﻿using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.Cookies;
using System.Security.Claims;

namespace Jesse_CookieBased.Controllers
{
    public class AccountController : Controller
    {
        public IActionResult MakeLogin(string ReturnUrl)
        {

            //登录验证逻辑自行实现


            var claims = new List<Claim>
            {
                new Claim("UserId","1"),
                new Claim(ClaimTypes.Name,"张三"),
                new Claim("UserName","admin"),
                new Claim(ClaimTypes.Role,"admin"),
                new Claim(ClaimTypes.MobilePhone,"13577889900"),
                new Claim(ClaimTypes.Email,"123226138@qq.com"),
                new Claim("Remark","备注一下下哇!")
            };

            var claimIdentity = new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme);

            //登录用户，相当于ASP.NET中的FormsAuthentication.SetAuthCookie
            //await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user);

            //可以使用HttpContext.SignInAsync方法的重载来定义持久化cookie存储用户认证信息，例如下面的代码就定义了用户登录后60分钟内cookie都会保留在客户端计算机硬盘上，
            //即便用户关闭了浏览器，60分钟内再次访问站点仍然是处于登录状态，除非调用Logout方法注销登录。
            //注意其中的AllowRefresh属性，如果AllowRefresh为true，表示如果用户登录后在超过50%的ExpiresUtc时间间隔内又访问了站点，就延长用户的登录时间（其实就是延长cookie在客户端计算机硬盘上的保留时间），
            //例如本例中我们下面设置了ExpiresUtc属性为60分钟后，那么当用户登录后在大于30分钟且小于60分钟内访问了站点，那么就将用户登录状态再延长到当前时间后的60分钟。但是用户在登录后的30分钟内访问站点是不会延长登录时间的，
            //因为ASP.NET Core有个硬性要求，是用户在超过50%的ExpiresUtc时间间隔内又访问了站点，才延长用户的登录时间。
            //如果AllowRefresh为false，表示用户登录后60分钟内不管有没有访问站点，只要60分钟到了，立马就处于非登录状态（不延长cookie在客户端计算机硬盘上的保留时间，60分钟到了客户端计算机就自动删除cookie）

            //HttpContext.SignInAsync(
            //CookieAuthenticationDefaults.AuthenticationScheme,//这里要注意的是HttpContext.SignInAsync(AuthenticationType,…) 所设置的Scheme一定要与前面的配置一样，这样对应的登录授权才会生效。
            //new ClaimsPrincipal(claimIdentity),
            //new AuthenticationProperties()
            //{
            //    IsPersistent = true,
            //    ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1),//有效时间
            //    AllowRefresh = true
            //});

            HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimIdentity), new AuthenticationProperties()
            {
                IsPersistent = true,
                ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1),//有效时间
                AllowRefresh = true
            });



            if (!string.IsNullOrEmpty(ReturnUrl))
            {
                return Redirect(ReturnUrl);
            }

            return Ok("登录成功!");
        }



        public IActionResult LogOut()
        {
            HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            
            return Ok("退出成功!");
        }
    }
}
